<?php
/**
 * DoWhile
 *
 * 'do-while' loops are very similar to while loops, except the truth expression
 * is checked at the end of each iteration instead of in the beginning.
 *
 * The main difference from regular while loops is that the first iteration
 * of a 'do-while' loop is guaranteed to run (the truth expression is only
 * checked at the end of the iteration), whereas it may not necessarily
 * run with a regular while loop (the truth expression is checked at the
 * beginning of each iteration, if it evaluates to FALSE right from the
 * beginning, the loop execution would end immediately). 
 *
 * @author  Badrus Said <badrus.said@gmail.com>
 * @since   gop1.0
 */
final class gop_DoWhile extends gop_BaseIterator {
    public function execute(gop_Base $_caller = null) {
        $this->setCaller($_caller);
        $cond = $this->getContext()->getCallee($this->expression);
        do {
            $this->getContext()->getCallee($this->ifTrue)->execute($this);
            if ($this->getContinue()) {
                $this->interuptContinue();
                continue;
            }
            if ($this->getBreak()) {
                $this->interuptBreak();
                break;
            }
            if ($this->getReturn()) return;
            $cond->execute($this);
        } while($this->getResult());
        $this->chainExec();
    }
}
?>